/*
 * Copyright 2010 Gaurav Saxena
 * 
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
 * in compliance with the License. You may obtain a copy of the License at
 * 
 * http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software distributed under the License
 * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
 * or implied. See the License for the specific language governing permissions and limitations under
 * the License.
 */
package com.gwtstructs.gwt.client.widgets.list;

import com.google.gwt.dom.client.Document;
import com.google.gwt.dom.client.Element;
import com.google.gwt.dom.client.NodeList;
import com.google.gwt.user.client.ui.ComplexPanel;
import com.google.gwt.user.client.ui.InsertPanel;
import com.google.gwt.user.client.ui.IsWidget;
import com.google.gwt.user.client.ui.Widget;

public class ListPanel extends ComplexPanel implements InsertPanel.ForIsWidget{
	protected ListPanel(Element elem) {
		setElement(elem);
	}
	public void add(Widget w) {
		super.add(w, getLiElement(getWidgetCount()));
	}
	public void add(IsWidget w) {
		this.add(w.asWidget());
	}
	private com.google.gwt.user.client.Element getLiElement(int index) {
		Element liElement = (Element) Document.get().createLIElement();
		NodeList<Element> allLiElements = getElement().getElementsByTagName("LI");
		if(index < allLiElements.getLength()) {
			Element item = allLiElements.getItem(index);
			getElement().insertBefore(liElement, item);
		} else
			getElement().insertBefore(liElement, null);
		return (com.google.gwt.user.client.Element) liElement;
	}
	@Override
	public void insert(Widget w, int beforeIndex) {
		super.insert(w, getLiElement(beforeIndex), beforeIndex, true);
	}
	@Override
	public void insert(IsWidget w, int beforeIndex) {
		insert(asWidgetOrNull(w), beforeIndex);
	}
	@Override
	public boolean remove(Widget w) {
		Element liElement = w.getElement().getParentElement();
		boolean isRemoved = super.remove(w);
		if(isRemoved)
			liElement.removeFromParent();
		return isRemoved;
	}
}